home *** CD-ROM | disk | FTP | other *** search
/ Aminet 33 / Aminet 33 - October 1999.iso / Aminet / dev / c / amiga-c-jun99.lha / amiga-c / june1999 / files / Midi.c < prev    next >
Encoding:
C/C++ Source or Header  |  1999-07-03  |  4.5 KB  |  195 lines

  1. #include <stdio.h>
  2. #include "DebugPrint.h"
  3.  
  4. #include <exec/exec.h>
  5. #include <proto/exec.h>
  6. #include <clib/alib_protos.h>
  7.  
  8. #include <devices/serial.h>
  9.  
  10. struct SerialIn {
  11.   struct MsgPort *msgport;
  12.   struct IOExtSer *serialio;
  13.   BOOL deviceopen;
  14. };
  15.  
  16. struct SerialIn *si = NULL;
  17.  
  18. #define serialbuffersize 4096 
  19. UBYTE serialbuffer[serialbuffersize];
  20.  
  21. void CloseMidiIn(void);
  22.  
  23. /*************************************************************************************/
  24.  
  25. void PrintHex(UBYTE dec)
  26. {
  27.   static char hex[]="0123456789ABCDEF";
  28.   static count=0;
  29.  
  30.   printf("%c%c ", hex[dec>>4], hex[dec&15]);
  31.   if(count++ == 19)
  32.   {
  33.     printf("\n");
  34.     count=0;
  35.   }
  36. }
  37.  
  38. /*************************************************************************************/
  39.  
  40. BOOL OpenMidiIn(void)
  41. {
  42.   if (si = (struct SerialIn *)AllocMem(sizeof(struct SerialIn), MEMF_PUBLIC|MEMF_CLEAR))
  43.   {
  44.     if (si->msgport = CreatePort(0,0))
  45.     {
  46.       if ( si->serialio = (struct IOExtSer *)CreateExtIO(si->msgport, sizeof(struct IOExtSer)) )
  47.       {
  48.         si->serialio->io_SerFlags = SERF_SHARED;
  49.  
  50.         if ( si->deviceopen = !OpenDevice("serial.device", 0L, (struct IORequest *)si->serialio, 0L) )
  51.         {
  52.           si->serialio->io_Baud = 31250;
  53.           si->serialio->io_ReadLen = 8;
  54.           si->serialio->io_WriteLen = 8;
  55.           si->serialio->io_StopBits = 1;
  56.           si->serialio->io_RBufLen = 512;
  57.           si->serialio->io_SerFlags |= SERF_XDISABLED | SERF_RAD_BOOGIE;
  58.           si->serialio->io_SerFlags &= ~(SERF_EOFMODE | SERF_PARTY_ON);
  59.           si->serialio->IOSer.io_Command = SDCMD_SETPARAMS;
  60.           return (0==DoIO((struct IORequest *)si->serialio));
  61.         }
  62.       }
  63.     }
  64.   }
  65.  
  66.   CloseMidiIn();
  67.   return FALSE;
  68. }
  69.  
  70. /*************************************************************************************/
  71.  
  72. void CloseMidiIn(void)
  73. {
  74.   if (si)
  75.   {
  76.     if (si->deviceopen) CloseDevice((struct IORequest *)si->serialio);
  77.     if (si->serialio) DeleteExtIO((struct IORequest *)si->serialio);
  78.     if (si->msgport) DeletePort(si->msgport);
  79.     FreeMem(si, sizeof(struct SerialIn));
  80.     si = NULL;
  81.   }
  82. }
  83.  
  84. /*************************************************************************************/
  85.  
  86. void ReceiveMidiData(ULONG *other_signals)
  87. {
  88.   struct IOExtSer *ioextser = si->serialio;
  89.   ULONG buffered;
  90.  
  91.   while (1)
  92.   {
  93.     ioextser->IOSer.io_Command = SDCMD_QUERY;
  94.     DoIO((struct IORequest *)ioextser);
  95.  
  96.     buffered = ioextser->IOSer.io_Actual;
  97.  
  98.     if (buffered == 0)
  99.     {
  100.       ioextser->IOSer.io_Length = 1;
  101.       ioextser->IOSer.io_Data = (APTR)serialbuffer;
  102.       ioextser->IOSer.io_Command = CMD_READ;
  103.       SendIO((struct IORequest *)ioextser);
  104.  
  105.       {
  106.         register ULONG serialmask = (1<<si->msgport->mp_SigBit);
  107.         register ULONG bits;
  108.  
  109.         bits = Wait(*other_signals | serialmask);
  110.  
  111.         if (bits & serialmask)
  112.         {
  113.           ULONG i;
  114.           for(i=0;i<ioextser->IOSer.io_Actual;i++)
  115.             PrintHex(serialbuffer[i]);
  116.  
  117.           if (ioextser->IOSer.io_Error != 0)
  118.           {
  119.             char temp[80];
  120.             sprintf(temp, "[error=%d]!!", ioextser->IOSer.io_Error);
  121.             dprintf(temp);
  122.           }
  123.  
  124.           WaitIO((struct IORequest *)ioextser);
  125.         }
  126.  
  127.         if (bits & (~serialmask))
  128.         {
  129.           AbortIO((struct IORequest *)ioextser);
  130.           WaitIO((struct IORequest *)ioextser);
  131.           *other_signals = bits & (~serialmask);
  132.           return;
  133.         }
  134.       }
  135.     }
  136.     else // bytes in queue
  137.     {
  138.       ioextser->IOSer.io_Length = buffered>serialbuffersize?serialbuffersize:buffered;
  139.       ioextser->IOSer.io_Data = (APTR)serialbuffer;
  140.       ioextser->IOSer.io_Command = CMD_READ;
  141.       DoIO((struct IORequest *)ioextser);
  142.  
  143.       if (ioextser->IOSer.io_Actual == 0)
  144.       {
  145.         char temp[80];
  146.         sprintf(temp, "Actual=%d, Buffered=%d!!", ioextser->IOSer.io_Actual, buffered);
  147.         dprintf(temp);
  148.         printf("*");
  149.       }
  150.  
  151.       if (ioextser->IOSer.io_Error != 0)
  152.       {
  153.         char temp[80];
  154.         sprintf(temp, "[error=%d]!!", ioextser->IOSer.io_Error);
  155.         dprintf(temp);
  156.       }
  157.  
  158.       {
  159.         ULONG i;
  160.  
  161.         printf("[");
  162.  
  163.         for(i=0;i<ioextser->IOSer.io_Actual;i++)
  164.           PrintHex(serialbuffer[i]);
  165.  
  166.         printf("]");
  167.       }
  168.     }
  169.   }
  170. }
  171.  
  172.  
  173. int main(void)
  174. {
  175.   dprintf("Program started.");
  176.  
  177.   if (OpenMidiIn())
  178.   {
  179.     while (1)
  180.     {
  181.       ULONG signals;
  182.       signals = SIGBREAKF_CTRL_C;
  183.  
  184.       ReceiveMidiData(&signals);
  185.  
  186.       if (signals & SIGBREAKF_CTRL_C)
  187.         break;
  188.     }
  189.     CloseMidiIn();
  190.   }
  191.  
  192.   dprintf("Program ended.");
  193.   return 0;
  194. }
  195.